package ThreadRunableVolite;

import java.util.Random;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;

/**
 * 
 * @author zybw-kf01 2018-5-14 
 * 
 * 三个运动员各自准备，等到三个人都准备好后，再一起跑
 * 
 * 为了实现线程间互相等待这种需求，我们可以利用 CyclicBarrier 数据结构，它的基本用法是：
 * 
 * 先创建一个公共 CyclicBarrier 对象，设置 同时等待 的线程数，CyclicBarrier cyclicBarrier = new CyclicBarrier(3);
 * 这些线程同时开始自己做准备，自身准备完毕后，需要等待别人准备完毕，这时调用 cyclicBarrier.await(); 即可开始等待别人；
 * 当指定的 同时等待 的线程数都调用了 cyclicBarrier.await();时，意味着这些线程都准备完毕好，然后这些线程才 同时继续执行。
 */
public class ThreadOrder5_CyclicBarrier {

	public static void main(String[] args) {

		runABCWhenAllReady();

	}

	private static void runABCWhenAllReady() {
		int runner=3;
		CyclicBarrier cyclicBarrier=new CyclicBarrier(3);
		Random random = new Random();
		for (char i = 'A'; i <='C' ; i++) {
			String runName = String.valueOf(i);
			new Thread(new Runnable() {
				
				@Override
				public void run() {
					int prepareTime = random.nextInt(10000)+100;
					System.out.println(runName + "is preparing for time:" + prepareTime);
					try {
						Thread.sleep(prepareTime);
						System.out.println(runName+" 进入等待");
						cyclicBarrier.await();
						System.out.println(runName+" Running");
						
						System.out.println();
					} catch (InterruptedException e) {
						
						e.printStackTrace();
					} catch (BrokenBarrierException e) {
						
						e.printStackTrace();
					}
					
					
				}
			}).start();


		}
		
	}


}
